import Vue from 'vue'

export default {
  namespaced: true,
  state: {
    // 购物车列表
    cartList: []
  },
  getters: {
    total (state) {
      return state.cartList.reduce((total, val) => {
        return (total = total + val.num * val.price)
      }, 0)
    }
  },
  mutations: {
    // 购物车已经有这个商品了,增加一个这个商品数量
    incrementItem (state, payload) {
      const cartItem = state.cartList.find((val) => val.id === payload.id)
      // 商品数量加1
      cartItem.num++
    },
    // 购物车并没有这个商品,所以要把这个商品push进去
    pushItem (state, payload) {
      // 商品数量肯定为1个,注意这里不要用payload.num = 1这种方式去新增属性,vue对于这种操作后续的变量改变是侦测不到的
      Vue.set(payload, 'num', 1)
      state.cartList.push(payload)
    },
    // 结算商品
    clearCartList (state) {
      state.cartList = []
    }
  },

  actions: {
    // 添加购物车
    /*  添加购物车要先判断,
 看购物车列表里面有没有这个商品,如果没有就添加这个商品到购物车,
 如果有,商品数量加一,同时库存减一。 */
    addCart ({ commit, state }, payload) {
      const shopId = payload.id
      const cartItem = state.cartList.find((val) => shopId === val.id)
      if (cartItem) {
        commit('incrementItem', cartItem)
      } else {
        // 购物车没有此商品,就把此商品的信息push进购物车列表
        commit('pushItem', payload)
      }
      /** 这个地方要把相应商品的库存减一,所以要调product模块的mutation方法,
      注意第一个和第三个参数
      **/
      commit('product/reduceProductInventory', cartItem || payload, {
        root: true
      })
    },
    // 结账
    checkout ({ commit }) {
      return new Promise((resolve, reject) => {
        const num = Math.random()
        if (num > 0.5) {
          setTimeout(() => {
            commit('clearCartList')
            resolve('success')
          }, 50)
        } else {
          reject(new Error('fail'))
        }
      })
    }
  }
}
